package line_arr;

import java.util.Arrays;

public class LineArr {
    public static void main(String[] args) {
        LineArrays la = new LineArrays();
        // 头插
        la.addEleHead(1);
        la.addEleHead(2);
        // 尾插
        la.addEleRear(3);
        la.addEleRear(4);
        // 任意插入元素
        la.addInsertAny(2, 3);
        // 修改元素值
//        la.alterElement(2, 6);
//        la.alterElement(4,9);
        // 删除指定位置的元素
//        la.delElement(1);
//        System.out.println(la);
        // 查询
        System.out.println(la.findEle(3));
        System.out.println(la.findIndexFirst(3));
        System.out.println(la.findIndexAll(3));
        System.out.println(la);
    }
}

class LineArrays {
    private int size;
    private int[] arr;

    public LineArrays() {
        arr = new int[3];
        size = 0; // 指向数组中最后一个元素的后一位置
    }

    public LineArrays(int size) {
        arr = new int[size];
        size = 0;
    }

    // 输出数组
    @Override
    public String toString() {
        String ret = "[";
        for (int i = 0; i < size; i++) {
            ret += arr[i];
            if (i != size - 1) {
                ret += ",";
            }
        }
        ret += "]";
        return ret;
    }

    // 为数组扩容
    private void grow() {
        int[] tmpArr = new int[arr.length << 2];
        for (int i = 0; i < size; i++) {
            tmpArr[i] = arr[i];
        }
        arr = tmpArr;
    }

    // 从指定区间向后移动数组元素
    private void moveEleBack(int left, int right) {
        if (right >= size || left < 0) {
            System.out.println("移动范围超过有效范围！");
            return;
        }
        for (int i = right + 1; i > left; i--) {
            arr[i] = arr[i-1];
        }
        arr[left] = 0; // 将头部设为空
        size++; // 移动之后调整有效元素个数
    }

    // 给头部插入元素
    public void addEleHead(int num) {
        // 判断当前数组是否已满
        if (arr.length == size) {
            grow();
        }
        moveEleBack(0, size - 1);
        arr[0] = num;
    }

    // 插入尾部
    public void addEleRear(int num) {
        // 判断当前数组是否满了
        if (arr.length == size) {
            grow();
        }
        arr[size] = num;
        size++;
    }

    // 给数组中间任意位置插入元素
    public void addInsertAny(int index, int num) {
        // 判断是否合法
        if (index < 0 || index >= size) {
            System.out.println("输入的索引值不合法！");
            return;
        }
        // 判断满否
        if (arr.length == size) {
            grow();
        }
        if (index == size - 1) {
            addEleRear(num);
        }
        if (index == 0) {
            addEleHead(num);
        }
        moveEleBack(index, size - 1);
        arr[index] = num;
    }

    // 修改任意位置的元素
    public void alterElement(int index, int newNum) {
        // 判断数组当前是否为空
        if (size == 0) {
            System.out.println("当前数组为空无法修改！");
            return;
        }
        // 判断合法性
        if (index < 0 || index >= size) {
            System.out.println("输入的索引值不合法！");
            return;
        }
        arr[index] = newNum;
    }

    // 将任意left到数组尾部内的元素向前移动
    private void moveEleFront(int left) {
        if (left < 0 || left >= size) {
            System.out.println("移动范围超过有效范围！");
            return;
        }
        for (int i = left; i < size - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr[size - 1] = 0; // 将头部设为空
        size--; // 移动之后调整有效元素个数
    }

    // 删除任意位置的元素
    public String delElement(int index) {
        // 判断合法性
        if (size == 0) {
            System.out.println("当前数组为空无法删除！");
            return null;
        }
        if (index < 0 || index >= size) {
            System.out.println("输入的索引值不合法！");
            return null;
        }
        int delEle = arr[index];
        moveEleFront(index);
        return "你删除的数为：" + delEle;
    }

    // 根据索引值查找指定位置元素值
    public int findEle(int index) {
        // 判断合法性
        if (size == 0) {
            System.out.println("当前数组为空！");
            return -1;
        }
        if (index < 0 || index >= size) {
            System.out.println("输入的索引值不合法！");
            return -1;
        }
        return arr[index];
    }

    // 根据给定元素值返回第一个索引
    public int findIndexFirst(int num) {
        for (int i = 0; i < size; i++) {
            if (arr[i] == num) {
                return i;
            }
        }
        return -1;
    }

    // 根据给定元素值返回该元素的所有索引
    public String findIndexAll(int num) {
        int tmp = size - 1;
        String ret = num + "的所有索引为:";
        while (tmp >= 0) {
            if (arr[tmp] == num) {
                ret = ret + tmp + " ";
            }
            tmp --;
        }
        return ret;
    }
}
